SQL Injection হল একটি অত্যন্ত বিপজ্জনক নিরাপত্তা দুর্বলতা, যেখানে আক্রমণকারী ডাটাবেসে ম্যালিসিয়াস SQL কোড ইনজেক্ট করে অ্যাপ্লিকেশনের ডেটা চুরি বা ক্ষতিগ্রস্ত করতে পারে। SQL Injection থেকে সুরক্ষা নিশ্চিত করা খুবই গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশনকে ডেটা চুরির, সিস্টেমের ক্ষতি বা এমনকি পুরো ডাটাবেসটি মুছে ফেলার ঝুঁকিতে ফেলতে পারে।
CodeIgniter এ SQL Injection থেকে সুরক্ষা পাওয়ার জন্য বিভিন্ন বিল্ট-ইন সুরক্ষা ফিচার এবং সিকিউর কোডিং পদ্ধতি ব্যবহার করা যেতে পারে।
CodeIgniter এর Query Builder ক্লাস SQL ইনজেকশন প্রতিরোধে অত্যন্ত কার্যকর। Query Builder SQL কুয়েরি তৈরি করতে প্যারামিটারাইজড কোয়েরি ব্যবহার করে, যা ইনপুট ডেটা নিরাপদে পরিচালনা করতে সহায়ক।
namespace App\Controllers;
use App\Models\ProductModel;
class ProductController extends BaseController
{
public function index()
{
$model = new ProductModel();
// ইনপুট ডেটা গ্রহণ
$searchTerm = $this->request->getPost('search');
// প্যারামিটারাইজড কোয়েরি ব্যবহার
$builder = $model->builder();
$builder->like('name', $searchTerm); // LIKE query
$products = $builder->get()->getResult();
// রেসপন্স প্রেরণ
return view('product_list', ['products' => $products]);
}
}
এই পদ্ধতিতে, SQL কুয়েরির অংশগুলোর সাথে সরাসরি ব্যবহারকারীর ইনপুট যুক্ত না করে, কোয়েরি তৈরির সময় ইনপুট প্যারামিটার হিসেবে স্থানান্তরিত করা হয়। এতে SQL Injection এর ঝুঁকি কমে যায়।
CodeIgniter এর Active Record (যা Query Builder হিসেবেও পরিচিত) স্বয়ংক্রিয়ভাবে ইনপুট ডেটাকে স্যানিটাইজ করে। তাই আপনাকে SQL কুয়েরিতে তথ্য ইনজেকশন রোধ করতে আলাদা কিছু করার প্রয়োজন হয় না।
namespace App\Models;
use CodeIgniter\Model;
class ProductModel extends Model
{
public function getProductById($id)
{
// Active Record এর মাধ্যমে ডেটা রিট্রিভ
return $this->where('id', $id)->first();
}
}
এখানে where()
পদ্ধতিটি ইনপুট ডেটা স্যানিটাইজ করে, যার ফলে SQL Injection রোধ করা হয়।
CodeIgniter Query Binding সিস্টেম ব্যবহার করে প্যারামিটারাইজড কোয়েরি তৈরি করতে সহায়তা করে। এতে প্লেইন SQL কোডে ব্যবহারকারীর ইনপুট মিশ্রিত না হয়ে, SQL ইনজেকশন প্রতিরোধ করা হয়।
namespace App\Controllers;
use App\Models\ProductModel;
class ProductController extends BaseController
{
public function search()
{
$model = new ProductModel();
// ব্যবহারকারীর ইনপুট থেকে সার্চ শব্দ গ্রহণ
$searchTerm = $this->request->getPost('search');
// Query Binding এর মাধ্যমে SQL ইনজেকশন প্রতিরোধ
$query = $model->query('SELECT * FROM products WHERE name LIKE :search:', ['search' => "%$searchTerm%"]);
$products = $query->getResult();
// রেসপন্স
return view('product_list', ['products' => $products]);
}
}
এখানে, :search
হল একটি প্যারামিটার, যা নিরাপদে ব্যবহারকারীর ইনপুট দিয়ে পরিবর্তিত হয়।
যতটা সম্ভব, Input Validation এবং Sanitization ব্যবহারকারীর ইনপুট নিরাপদ করে। এই পদ্ধতিগুলি ব্যবহারকারীর ইনপুট সঠিক এবং নিরাপদ কিনা তা পরীক্ষা করে, এবং শুধুমাত্র বৈধ ইনপুট গ্রহণ করে।
namespace App\Controllers;
use CodeIgniter\Controller;
class ProductController extends Controller
{
public function create()
{
// ইনপুট ভ্যালিডেশন
if (!$this->validate([
'name' => 'required|min_length[3]|max_length[100]',
'price' => 'required|decimal'
])) {
return view('product_form', ['validation' => $this->validator]);
}
// ইনপুট গ্রহণ
$name = $this->request->getPost('name');
$price = $this->request->getPost('price');
// Model এ ডেটা ইনসার্ট
$productModel = new \App\Models\ProductModel();
$productModel->save([
'name' => $name,
'price' => $price
]);
}
}
এখানে validate()
মেথড ব্যবহার করা হয়েছে ইনপুট ডেটা যাচাই করার জন্য, যা SQL Injection প্রতিরোধে সহায়ক।
যদি কোয়েরি তৈরি করার সময় Query Builder ব্যবহার না করতে হয়, তাহলে escape() ফাংশন ব্যবহার করে কাঁচা SQL ইনপুট স্যানিটাইজ করা যেতে পারে।
namespace App\Controllers;
use App\Models\ProductModel;
class ProductController extends BaseController
{
public function search()
{
$searchTerm = $this->request->getPost('search');
// Escape input to prevent SQL injection
$escapedSearchTerm = $this->db->escapeLikeString($searchTerm);
$builder = $this->db->table('products');
$builder->like('name', $escapedSearchTerm);
$products = $builder->get()->getResult();
return view('product_list', ['products' => $products]);
}
}
এখানে escapeLikeString()
ফাংশন ব্যবহার করা হয়েছে, যা ইনপুট ডেটা সঠিকভাবে স্যানিটাইজ করে।
SQL ইনজেকশন প্রতিরোধের জন্য Prepared Statements ব্যবহৃত হতে পারে, যা ডেটাবেসে কোয়েরি চালানোর আগে ডেটা এবং কোয়েরি অংশ আলাদা রাখে।
namespace App\Controllers;
use App\Models\ProductModel;
class ProductController extends BaseController
{
public function getProductById($id)
{
$query = $this->db->query('SELECT * FROM products WHERE id = :id:', ['id' => $id]);
return $query->getRow();
}
}
এখানে, :id
হল একটি প্যারামিটার যা SQL কুয়েরির অংশ হিসেবে যুক্ত করা হয়, এবং ['id' => $id]
দিয়ে প্যারামিটার নিরাপদে সেট করা হয়।
SQL Injection প্রতিরোধের জন্য CodeIgniter বেশ কয়েকটি নিরাপদ পদ্ধতি সরবরাহ করে, যেমন Query Builder, Prepared Statements, Input Validation, এবং Sanitization। এই পদ্ধতিগুলোর মাধ্যমে ইনপুট ডেটাকে সঠিকভাবে প্রক্রিয়া করে ডাটাবেসে নিরাপদভাবে সংরক্ষণ করা হয়, যা SQL Injection থেকে অ্যাপ্লিকেশনকে সুরক্ষিত রাখে।
Read more